#include "imagem.h"

int compara (pNo_PK obra1, pNo_PK obra2 ) { 
	return strcmp (obra1->titulo,obra2->titulo); /* compara duas obras usando strcmp e retorna o resultado */

}

void menu_consulta(pNo_PK obras, int tamanho, pNo_PK sk_titulo, pNo_PK sk_tipo, pNo_PK sk_autor, pNo_PK sk_ano, int ttitulo, int ttipo, int tautor, int tano, int tam_nrr) {
	int op=7;
	char *busca;
	printf("\nA busca pode ser realizada de duas maneiras: Uma listagem completa das obras na base de dados ou busca por algum campo.\nNo caso da listagem o arquivo \"listagem.html\" sera criado, para a busca por campos sera criado o arquivo \"resultado.html\".\nA busca funcionara apenas digitando UMA palavra do titulo ou o titulo inteiro, letras maiusculas ou minusculas nao fazem diferenca. O mesmo vale para tipo e autor.\n");

	while (op != 6) {
		printf("**********************************************\n**********************************************\n**                                          **\n         1 - Listar todas as obras\n         2 - Procurar obras por titulo\n         3 - Procurar obras por tipo\n         4 - Procurar obras por autor\n         5 - Procurar obras por ano\n         6 - Voltar\n**                                          **\n**********************************************\n**********************************************\n");

		scanf("%d", &op);

		__fpurge(stdin);

		switch(op) { /*opcoes de consulta */
			case 1:
				lista_HTML(obras, tamanho); /* chama funcao que lista todas as obras */
				break;
			case 2:
				__fpurge(stdin);
				printf("Digite o titulo da obra a ser procurada: "); /* recebe o titulo a ser procurado */
				remove_espacos(); /* retira os espacos iniciais */
				busca = malloc(sizeof(char)*(tam_titulo+1));
				fgets(busca, tam_titulo, stdin);
				completa_espacos(busca, tam_titulo);
				Str_toupper(busca); /* transforma em maiusculo */			
				procura_tit(busca, obras, sk_titulo, ttitulo, tam_nrr); /* chama a funcao de procura */
				free(busca);
				break;
			case 3: /* semelhante para tipo, autor e ano */
				__fpurge(stdin);
				printf("Digite o tipo da obra a ser procurada: ");
				remove_espacos();
				busca = malloc(sizeof(char)*(tam_titulo+1));
				fgets(busca, tam_tipo, stdin);		
				completa_espacos(busca, tam_tipo);
				Str_toupper(busca);
				procura_tipo(busca, obras, sk_tipo, ttipo, tam_nrr);
				free(busca);
				break;
			case 4:	
				__fpurge(stdin);
				printf("Digite o autor da obra a ser procurada: ");
				remove_espacos();
				busca = malloc(sizeof(char)*(tam_titulo+1));
				fgets(busca, tam_autor, stdin);
				completa_espacos(busca, tam_autor);
				Str_toupper(busca);		
				procura_autor(busca, obras, sk_autor, tautor, tam_nrr);
				free(busca);
				break;
			case 5:
				__fpurge(stdin);
				printf("Digite o ano da obra a ser procurada: ");
				remove_espacos();
				busca = malloc(sizeof(char)*(tam_titulo+1));
				fgets(busca, tam_ano+2, stdin);	
				completa_espacos(busca, tam_ano);
				procura_ano(busca, obras, sk_ano, tano, tam_nrr);
				free(busca);
				break;

			case 6:
				break; /* volta para o menu anterior */
			default:
				printf("Opcao Invalida.\n");
				break;
		}	
	}

}


void inicio_HTML (FILE *arq) {
	fputs("<html>\n<head>\n</head>\n<body><font size=\"10\"><b><center>Resultado(s) da busca:</b></font></center><p><br>", arq);
	/* escreve o inicio do codigo HTML no arquivo */
}

int escreve(FILE *origem, FILE *destino, char texto[], int tamanho, int atual) {
	char *nome;

	nome = (char *)malloc(sizeof(char)*(tamanho+2));
	fseek(origem, atual, SEEK_SET); /*coloca o cursor de leitura na posicao atual */

	fputs(texto, destino); /* escreve o texto e o valor da variavel no arquivo */
	fgets(nome, tamanho+1, origem);
	nome[tamanho+1] = '\0';
	fputs(nome, destino);
	fputs("<br>", destino);

	free(nome); /* libera a memoria */

	atual += tamanho; /*atualiza a posicao atual */
	return atual;

}


void escreve_img(FILE *origem, FILE *destino, char texto[], int tamanho, int atual) {
	char *nome, *extensao;

	nome = (char *)malloc(sizeof(char)*(tamanho-1));
	extensao = (char *)malloc(sizeof(char)*(5));

	fseek(origem, atual, SEEK_SET); /*coloca o cursor de leitura na posicao atual */

	fputs(texto, destino); /* escreve o comeco do codigo para aprecer a imagem */
	fgets(nome, tamanho-2, origem); /* escreve o codigo da imagem */
	fputs(nome, destino);
	nome[tamanho-2] = '\0';
	fputs(".", destino); /*escreve o ponto */

	fseek(origem, atual+tamanho-3, SEEK_SET); /* coloca o cursor de leitura na posicao atual */

	fgets(extensao, 4, origem); /* escreve a extensao */
	extensao[4] = '\0';
	fputs(extensao, destino);
	fputs("\"><br><hr><br>", destino); /* finaliza o codigo html */

	free(nome);
	free(extensao); /* libera a memoria */
}


void meio_HTML (FILE *resultado, int nrr) {
	FILE *dados = fopen("base00.dat", "r");
	int atual;
	if (!dados) { /* caso na consiga abrir o arquivo */
		printf ("Erro na abertura do arquivo, finalizando consulta.\n");
		return;
	}
	atual = (nrr-1)*tam_total; /* acha a posicao de acordo com a nrr */

	atual =escreve(dados, resultado, "Titulo: ", tam_titulo, atual); /* passa os valores para a funcao que escreve */
	atual =escreve(dados, resultado, "Tipo: ", tam_tipo, atual);
	atual =escreve(dados, resultado, "Autor: ", tam_autor, atual);
	atual =escreve(dados, resultado, "Ano: ", tam_ano, atual);
	atual = escreve(dados, resultado, "Valor: ", tam_valor, atual);
	escreve_img(dados, resultado, "<img src=\"img/", tam_imagem, atual);

	fclose(dados);


}

void fim_HTML (FILE *arq) {
	/* finaliza o codigo html */
	fputs("</body>\n</html>", arq);

}

void procura_tit(char *titulo, pNo_PK obras, pNo_PK SK, int tamanho, int tam_nrr) {
	FILE *arquivo = fopen("pk_titulo.dat", "r+"); /* chama para o arquivo correspondente */
	procura_aux(titulo, obras, SK, tamanho, arquivo, tam_nrr); /* o mesmo para funcoes abaixo */
	fclose(arquivo);
}
void procura_tipo(char *titulo, pNo_PK obras, pNo_PK SK, int tamanho, int tam_nrr) {
	FILE *arquivo = fopen("pk_tipo.dat", "r+");
	procura_aux(titulo, obras, SK, tamanho, arquivo, tam_nrr);
	fclose(arquivo);
}
void procura_autor(char *titulo, pNo_PK obras, pNo_PK SK, int tamanho, int tam_nrr) {
	FILE *arquivo = fopen("pk_autor.dat", "r+");
	procura_aux(titulo, obras, SK, tamanho, arquivo, tam_nrr);
	fclose(arquivo);
}
void procura_ano(char *titulo, pNo_PK obras, pNo_PK SK, int tamanho, int tam_nrr) {
	FILE *arquivo = fopen("pk_ano.dat", "r+");
	procura_aux(titulo, obras, SK, tamanho, arquivo, tam_nrr);
	fclose(arquivo);
}

void procura_aux(char *titulo, pNo_PK obras, pNo_PK SK, int tamanho, FILE *arquivo, int tam_nrr) {
	pNo_PK busca;
	FILE *resultado = fopen("resultado.html", "w");
	char *PK = malloc(sizeof(char)*(tam_titulo+1));
	char next[dig_nrr+1];
	int prox=0, tam_vetor=0, i;
	pNo_PK vetor;

	inicio_HTML(resultado);
	busca = bsearch (titulo, SK, tamanho, sizeof (struct No_PK), (int(*)(const void*,const void*))compara); /* procura a obra no vetor */

	if(busca) { /* caso tenha achado */
		if(busca->nrr != -1) {
			vetor=malloc(sizeof(No_PK)*20);
			prox = busca->nrr;
			while (prox != -1) {
				fseek(arquivo, (prox-1)*(tam_titulo+dig_nrr), SEEK_SET); 
				fread(PK, 1, tam_titulo, arquivo);
				PK[tam_titulo] = '\0';
				fseek(arquivo, prox*(tam_titulo+dig_nrr)-dig_nrr, SEEK_SET);
				fread(next,1, dig_nrr, arquivo);
				next[dig_nrr] = '\0';
				prox = atoi(next);
				busca = bsearch(PK, obras, tam_nrr, sizeof (struct No_PK), (int(*)(const void*,const void*))compara); /* procura a obra no vetor */
				if(busca) {
					tam_vetor = Le_PK(&vetor,busca->titulo,busca->nrr,tam_vetor, tam_nrr);
				}
			}
			qsort(vetor, tam_vetor, sizeof(No_PK), (int(*)(const void*,const void*))compara);
			for(i=0;i<tam_vetor;i++) { /* percorre todo o vetor (ordenado) e imprime as obras */
				meio_HTML(resultado, vetor[i].nrr);
			}
			printf("\nArquivo resultado.html com o resultado gerado!\n\n");
			free(vetor);
		}
		else { /* caso nao encontre a obra */
		fputs("<font size=\"5\"><center>Nenhuma obra encontrada!</font></center><p><br>", resultado);
		printf("\nNenhuma obra correspondente encontrada.\n\n");
	}
	}

	else { /* caso nao encontre a obra */
		fputs("<font size=\"5\"><center>Nenhuma obra encontrada!</font></center><p><br>", resultado);
		printf("\nNenhuma obra correspondente encontrada.\n\n");
	}
	fim_HTML(resultado);
	fclose(resultado);
	free(PK);
	return;
}


void lista_HTML(pNo_PK obras, int tamanho) { /* lista todas as obras */
	int i;
	FILE *lista = fopen("listagem.html", "w");

	inicio_HTML(lista);
	for(i=0;i<tamanho;i++) { /* percorre todo o vetor (ordenado) e imprime as obras */
		meio_HTML(lista, obras[i].nrr);
	}
	fim_HTML(lista);

	printf("\nArquivo listagem.html com a lista gerado!\n\n");


	fclose(lista);
}
